package tp.algo2.futbol;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.eclipse.xtext.xbase.lib.InputOutput;
import org.eclipse.xtext.xbase.lib.IterableExtensions;
import org.eclipse.xtext.xbase.lib.Procedures.Procedure1;
import tp.algo2.futbol.Jugador;
import tp.algo2.futbol.Mail;
import tp.algo2.futbol.NotificadorXMail;

@SuppressWarnings("all")
public class Partido {
  private List<Jugador> _jugadores;
  
  public List<Jugador> getJugadores() {
    return this._jugadores;
  }
  
  public void setJugadores(final List<Jugador> jugadores) {
    this._jugadores = jugadores;
  }
  
  private String _dia;
  
  public String getDia() {
    return this._dia;
  }
  
  public void setDia(final String dia) {
    this._dia = dia;
  }
  
  private String _lugar;
  
  public String getLugar() {
    return this._lugar;
  }
  
  public void setLugar(final String lugar) {
    this._lugar = lugar;
  }
  
  private Set<NotificadorXMail> _observers;
  
  public Set<NotificadorXMail> getObservers() {
    return this._observers;
  }
  
  public void setObservers(final Set<NotificadorXMail> observers) {
    this._observers = observers;
  }
  
  private Jugador _jugadorQPuntua;
  
  public Jugador getJugadorQPuntua() {
    return this._jugadorQPuntua;
  }
  
  public void setJugadorQPuntua(final Jugador jugadorQPuntua) {
    this._jugadorQPuntua = jugadorQPuntua;
  }
  
  private Set<Mail> mailsEnviados;
  
  private int _idPartido;
  
  public int getIdPartido() {
    return this._idPartido;
  }
  
  public void setIdPartido(final int idPartido) {
    this._idPartido = idPartido;
  }
  
  private Partido _estePartido;
  
  public Partido getEstePartido() {
    return this._estePartido;
  }
  
  public void setEstePartido(final Partido estePartido) {
    this._estePartido = estePartido;
  }
  
  public Partido() {
    ArrayList<Jugador> _arrayList = new ArrayList<Jugador>();
    this.setJugadores(_arrayList);
    HashSet<NotificadorXMail> _hashSet = new HashSet<NotificadorXMail>();
    this.setObservers(_hashSet);
    HashSet<Mail> _hashSet_1 = new HashSet<Mail>();
    this.mailsEnviados = _hashSet_1;
  }
  
  public void generarId(final int id) {
    this.setIdPartido(id);
  }
  
  public int cantidadDeJugadores() {
    List<Jugador> _jugadores = this.getJugadores();
    int _size = _jugadores.size();
    return _size;
  }
  
  /**
   * def devolverJugadores(){    //Refactoring Alex Baico
   * return jugadores
   * }
   */
  public void notificarPartidoCompleto() {
    boolean _partidoIncompleto = this.partidoIncompleto();
    boolean _not = (!_partidoIncompleto);
    if (_not) {
      Set<NotificadorXMail> _observers = this.getObservers();
      final Procedure1<NotificadorXMail> _function = new Procedure1<NotificadorXMail>() {
          public void apply(final NotificadorXMail ob) {
            ob.partidoCompleto(Partido.this);
          }
        };
      IterableExtensions.<NotificadorXMail>forEach(_observers, _function);
    }
  }
  
  public boolean partidoIncompleto() {
    int _cantidadDeJugadores = this.cantidadDeJugadores();
    boolean _lessThan = (_cantidadDeJugadores < 10);
    return _lessThan;
  }
  
  public void notificarPartidoIncompleto() {
    boolean _partidoIncompleto = this.partidoIncompleto();
    if (_partidoIncompleto) {
      Set<NotificadorXMail> _observers = this.getObservers();
      final Procedure1<NotificadorXMail> _function = new Procedure1<NotificadorXMail>() {
          public void apply(final NotificadorXMail ob) {
            ob.partidoIncompleto(Partido.this);
          }
        };
      IterableExtensions.<NotificadorXMail>forEach(_observers, _function);
    }
  }
  
  public String agregarJugador(final Jugador jugador) {
    String _xifexpression = null;
    boolean _puedeJugar = jugador.puedeJugar(this);
    if (_puedeJugar) {
      List<Jugador> _jugadores = this.getJugadores();
      _jugadores.add(jugador);
      jugador.notificarAmigos();
      this.notificarPartidoCompleto();
    } else {
      String _println = InputOutput.<String>println("No puede jugar");
      _xifexpression = _println;
    }
    return _xifexpression;
  }
  
  public boolean agregarObserver(final NotificadorXMail obser) {
    Set<NotificadorXMail> _observers = this.getObservers();
    boolean _add = _observers.add(obser);
    return _add;
  }
  
  public boolean removerObserver(final Object obser) {
    Set<NotificadorXMail> _observers = this.getObservers();
    boolean _remove = _observers.remove(obser);
    return _remove;
  }
  
  public void sacarJugador(final Jugador jugador) {
    List<Jugador> _jugadores = this.getJugadores();
    _jugadores.remove(jugador);
    this.notificarPartidoIncompleto();
  }
  
  public Jugador partidoPuntuadoPor(final Jugador jugador) {
    Jugador _jugadorQPuntua = this.getJugadorQPuntua();
    return _jugadorQPuntua;
  }
  
  /**
   * tp5 miguel angel lunda medrano
   */
  public void sacarATodosDeLaLista() {
    List<Jugador> _jugadores = this.getJugadores();
    _jugadores.clear();
  }
}
